package com.ruoyi.novel.config;

import java.util.HashMap;
import java.util.Map;

public class NumberToChineseConverter {
    private static final String[] CHINESE_DIGITS = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    private static final String[] UNITS = {"", "十", "百", "千", "万"};

    // 中文数字到阿拉伯数字的映射表
    private static final Map<String, Integer> CHINESE_TO_ARABIC_MAP = new HashMap<>();

    static {
        // 初始化中文数字到阿拉伯数字的映射
        for (int i = 0; i < CHINESE_DIGITS.length; i++) {
            CHINESE_TO_ARABIC_MAP.put(CHINESE_DIGITS[i], i);
        }
        CHINESE_TO_ARABIC_MAP.put("十", 10);
        CHINESE_TO_ARABIC_MAP.put("百", 100);
        CHINESE_TO_ARABIC_MAP.put("千", 1000);
        CHINESE_TO_ARABIC_MAP.put("万", 10000);
    }

    /**
     * 阿拉伯数字转中文数字（1-3000）
     */
    public static String arabicToChinese(int number) {
        if (number < 1 || number > 3000) {
            throw new IllegalArgumentException("仅支持1-3000的转换");
        }

        StringBuilder chinese = new StringBuilder();
        String numStr = String.valueOf(number);
        int length = numStr.length();

        for (int i = 0; i < length; i++) {
            int digit = Character.getNumericValue(numStr.charAt(i));
            int unitIndex = length - i - 1;
            String unit = UNITS[unitIndex];

            if (digit == 0) {
                // 处理连续零的情况
                if (chinese.length() > 0 && !chinese.substring(chinese.length() - 1).equals(CHINESE_DIGITS[0])) {
                    chinese.append(CHINESE_DIGITS[digit]);
                }
            } else {
                chinese.append(CHINESE_DIGITS[digit]).append(unit);
                // 处理零的特殊情况（如1001）
                if (unitIndex > 0 && i < length - 1) {
                    int nextDigit = Character.getNumericValue(numStr.charAt(i + 1));
                    if (nextDigit == 0) {
                        chinese.append(CHINESE_DIGITS[0]);
                    }
                }
            }
        }

        // 特殊处理（如10→"十"，而不是"一十"）
        String result = chinese.toString()
                .replaceAll("零+$", "")  // 去除末尾零
                .replaceAll("零+([十百千])", "$1")  // 去除中间多个零
                .replaceAll("^一十", "十");  // 10→"十"

        return result.isEmpty() ? CHINESE_DIGITS[0] : result;
    }

    /**
     * 中文数字转阿拉伯数字（支持“第一章”格式）
     */
    public static int chineseToArabic(String input) {
        if (input == null || input.isEmpty()) {
            throw new IllegalArgumentException("输入不能为空");
        }

        // 提取中文数字部分（去掉“第”和“章”）
        String chineseNumber = extractChineseNumber(input);

        // 调用核心转换逻辑
        return parseChineseNumber(chineseNumber);
    }

    /**
     * 提取中文数字部分（如从“第一章”中提取“一”）
     */
    private static String extractChineseNumber(String input) {
        if (!input.startsWith("第") || !input.endsWith("章")) {
            throw new IllegalArgumentException("章节格式错误，应为'第X章'");
        }
        return input.substring(1, input.length() - 1); // 提取中间部分
    }

    /**
     * 解析中文数字（如“一” → 1，“一千零一” → 1001）
     */
    private static int parseChineseNumber(String chinese) {
        int result = 0;
        int temp = 0; // 临时存储当前部分的值
        int unit = 1; // 当前单位（默认为1）

        for (int i = chinese.length() - 1; i >= 0; i--) {
            char c = chinese.charAt(i);
            String str = String.valueOf(c);

            if (!CHINESE_TO_ARABIC_MAP.containsKey(str)) {
                throw new IllegalArgumentException("非法的中文数字字符: " + str);
            }

            int value = CHINESE_TO_ARABIC_MAP.get(str);

            if (value >= 10) { // 如果是单位（十、百、千、万）
                if (temp == 0) {
                    temp = 1; // 如果没有数字在单位前，默认为1（如"十"表示10）
                }
                temp *= value;
                if (value >= 10000) { // 处理"万"
                    result += temp;
                    temp = 0;
                }
            } else { // 如果是数字
                temp += value;
            }
        }

        result += temp; // 加上最后的部分
        return result;
    }
}